iT邦幫忙

2

聊天軟體實作(1): 從資料儲存開始

  • 分享至 

  • xImage
  •  

對於一個簡單的聊天室而言,大致上只需要User資料表記錄使用者,Message資料表紀錄訊息內容、發送方使用者、接受方使用者、時間戳等等。
https://ithelp.ithome.com.tw/upload/images/20220718/20139626Hkcb4xi3J0.png

問題是,如果是多人聊天室,當A發一筆訊息時,聊天室有500個成員,這時Message資料表就會瞬間新增至少499筆,顯然有優化的選項。

資料庫正規化

換個角度想,把要發送的對象抽出來,由另外一張表負責記錄聊天室的成員。這樣一來,不管訊息新增幾筆,Message資料表只需要記住是哪一個聊天室Id,便可以知道該發送給誰。
也就是資料庫正規化的第二級原則
https://ithelp.ithome.com.tw/upload/images/20220718/20139626NmPDHxBqIF.png

*上圖的Message資料表,我先省略"發送方使用者"的欄位及關連,讓圖示更清楚些。

在設計資料庫時,正規化的原則可以增進資料庫效能、減少儲存記憶體浪費。

正規化有三個階段:

(1) 第一級正規化
      1.消除每個資料表中同類型的欄位
         (例如: Message資料表有兩個欄位-接受者1、接受者2,合併成接受者一個欄位)

      2.使用一個**主鍵值(PK)**來識別每一筆資料
         (例如: Message資料表有Id,跟身分證一樣,可以區分不同筆資料)
(2) 第二級正規化
       1.會重複出現的欄位資料,拆分獨立的資料表
       2.透過一個外來鍵值(Foreign key)來關聯這些資料表的資料
(3) 第三級正規化
       1.消除與主鍵無關的欄位
           (例如: Message表有使用者資訊UserPhone,很容易在資料異動時出錯)
       2.**消除遞移關係**
            ( X->Y,Y->Z 所以X->Z。例如: 總金額 = 商品單價* 數量,
             這時可能不適合把總金額欄位和數量放在同一張表,
             數量異動時可能會造成總金額錯誤)

/images/emoticon/emoticon06.gif正規化就是減少資料重複、減少資料錯誤,但同時會造成查詢變複雜(需要JOIN),所以依照需求和資料量設計資料庫才是王道。

下一篇: 聊天軟體實作(2):從讀寫需求評估資料儲存


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言